package es.gesfutbol.dao;

import java.util.ArrayList;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Set;

import org.hibernate.Hibernate;
import org.hibernate.LockMode;
import org.hibernate.criterion.Order;
import org.hibernate.criterion.Restrictions;
import org.springframework.transaction.annotation.Transactional;

import es.gesfutbol.domini.implementacio.Jornada;
import es.gesfutbol.domini.implementacio.Lliga;
import es.gesfutbol.domini.implementacio.Partit;
import es.gesfutbol.util.HibernateDao;
import es.gesfutbol.util.HibernateHelper;

public class JornadaDao extends HibernateDao<Jornada, Long> implements IJornadaDao{

	@Transactional(readOnly=false)
	public void delete(Long idJornada) {
		//Obtenim la jornada a eliminar.
		Jornada jornada = this.findById(idJornada);
		//Eliminem la jornada.
		this.delete(jornada);		
	}

	@SuppressWarnings("deprecation")
	@Transactional(readOnly = true)
	public Jornada deproxy(Jornada jornada) {
			Set<Partit> partits = jornada.getPartits();
		 	this.getSessionFactory().getCurrentSession().lock(jornada, LockMode.NONE);
		 	Hibernate.initialize(partits);
	        Iterator<Partit> itPartit = partits.iterator();
	        Set<Partit> partits2 = new HashSet<Partit>();
	        while (itPartit.hasNext()) {
	            Partit partit = itPartit.next();
	            Hibernate.initialize(partit);
	            partit = HibernateHelper.deproxy(partit, Partit.class);
	            partits2.add(partit);
	        }
	        jornada.setPartits(partits2);	        
	        return jornada;
	}
	
	@SuppressWarnings("deprecation")
	@Transactional(readOnly = true)
	public Jornada deproxyLliga(Jornada jornada){
		//Estadi
		Lliga lliga = jornada.getLliga();
		this.getSessionFactory().getCurrentSession().lock(jornada, LockMode.NONE);
		Hibernate.initialize(lliga);
		lliga = HibernateHelper.deproxy(lliga, Lliga.class);
		jornada.setLliga(lliga);
		
		return jornada;
	}

	@Transactional(readOnly=false)
	public void save(Jornada jornada) {
		this.getSessionFactory().getCurrentSession().saveOrUpdate(jornada);		
	}
	
	@Transactional(readOnly = true)
	public List<Jornada> findByIdLliga(Long idLliga){
		
		@SuppressWarnings("unchecked")
		List<Jornada> listJornades = this.getSessionFactory().getCurrentSession().createCriteria(Jornada.class)
	    .addOrder( Order.asc("numero") )
		.createCriteria("lliga")
	    	.add( Restrictions.like("idLliga", idLliga) )
	    .list();				
	
		return listJornades;		
	}
	
	@Transactional(readOnly = true)
	public List<Jornada> findActives(){
		
		@SuppressWarnings("unchecked")
		List<Jornada> listJornades = this.getSessionFactory().getCurrentSession().createCriteria(Jornada.class)
	    .add( Restrictions.eq("estaActiu", true) )
		.addOrder( Order.asc("numero") )
		.list();				
	
		return listJornades;		
	}
	
	@SuppressWarnings("deprecation")
	@Transactional(readOnly = true)
	public List<Jornada> deproxyLligues(List<Jornada> jornades){
		
		Iterator<Jornada> itJornada = jornades.iterator();
		List<Jornada> jornades2 = new ArrayList<Jornada>();
		while (itJornada.hasNext()) {
			Jornada jornada = itJornada.next();
			this.getSessionFactory().getCurrentSession().lock(jornada, LockMode.NONE);
			Lliga lliga = jornada.getLliga();
			Hibernate.initialize(lliga);
			lliga = HibernateHelper.deproxy(lliga, Lliga.class);
			jornada.setLliga(lliga);			
			jornades2.add(jornada);
		}
		return jornades2;
	}
}
